/**
 * @desc 524. Longest Word in Dictionary through Deleting
 * 
 * 给定一个字符串和一个字符串字典，找到字典里面最长的字符串，
 * 该字符串可以通过删除给定字符串的某些字符来得到。
 * 如果答案不止一个，返回长度最长且[字典顺序]最小的字符串。
 * 如果答案不存在，则返回空字符串。
 * 
 * @example
 *  s = "abpcplea", d = ["ale","apple","monkey","plea"]
 *  output: "apple"
 * 
 *  s = "abpcplea", d = ["a","b","c"]
 *  output "a"
        // 对当前的curS进行hash一下
        // 然后比对他们的hash 。
        // 1.curHash里有的属性是否s里有，不满足则 return ""
        // 满足的情况下看，料是否够用 在每个料都够用的情况下 ，这个元素是合格的
        // 则push入resArr
        // 然后从resArr里找到最长的。
        // 如果最长的，那么按照字典序排列 sort一下
 */
let s = "abpcpleea";
let d = ["ale","apple","monkey","plea"];
let res  = findLongestWord(s,d);
console.log(res)
function findLongestWord(s, d) {
    // 将s hash了
    let sHash = getHash(s);
    let sKeys = Object.keys(sHash);
    let result = [];
    // 遍历数组d
    for(let i=0;i<d.length;i++){
        let curS = d[i];
        let curHash =  getHash(curS);
        let curkeys = Object.keys(curHash);
        if(curkeys.length>sKeys.length){
           continue;// 跳过这个元素的检查
        }
        let index = 0;
        for(let i=0;i<curkeys.length;i++){
            let k = curkeys[i];
            if(curHash[k]<=sHash[k]){
                index++;
            }
        }
        if(index===curS.length){
            result.push(curS);
        }
    }
    // 遍历result 得到最大的字符串 
    let res = getLongestStr(result);
    return res.sort()[0];
};


// 按照字母Hash
function getHash(s){
    let hash  = {};
    for(let i=0;i<s.length;i++){
        if(!hash[s[i]]){
            hash[s[i]] = 0;
        }
        hash[s[i]]++;
    }
    return hash;
}



function getLongestStr(arr){
    let longLen  = 0;
    for(let i=0;i<arr.length;i++){
        if(arr[i].length>longLen){
            longLen = arr[i].length;
        }
    }
    return arr.filter((ele)=>ele.length===longLen);
}